from requests import get,post
from json import loads
zy_code_url = 'https://yz.chsi.com.cn/zsml/pages/getMl.jsp'
zy_code_result = get(zy_code_url)
zy_codes = loads(zy_code_result.text)
count = 1
for zy_code in zy_codes:
    print(zy_code['mc'] + ',专业代码（学硕）为:', zy_code['dm'])

mldm = input('请输入学科代码（查看专硕类输入zyxw）')
erjixueke_url = 'https://yz.chsi.com.cn/zsml/pages/getZy.jsp'
erjixueke_result = post(erjixueke_url, data={'mldm': mldm})
erjixueke_codes = loads(erjixueke_result.text)
if mldm == 'zyxw':
    print('===============================')
    print('专硕的专业领域')
    for erji_code in erjixueke_codes:
        print(erji_code['mc'], '它的专业代码为', erji_code['dm'])
    yjxkdm = input('输入,你要查看的专业领域代码(格式为0XXX)')
else:
    print('===============================')
    print('你选择的学硕,它的学科类别有：')
    for erji_code in erjixueke_codes:
        print(erji_code['mc'], '它的学科代码为', erji_code['dm'])
    yjxkdm = input('输入,你要查看的学科类别代码(格式为0XXX)')

# mldm
# yjxkdm


# 存储所有包含 应用统计 的学校名称
school_names = []
# 对于存储该学校的地区
school_areas = []
# 对应存储该学校的地区代码
school_areas_code = []
# 存储所有收集來的
informations = []
# 获取所有的信息，属于 存储列表的列表
# 导入必要的request和bs4库
import requests
from bs4 import BeautifulSoup
from xlwt import Workbook


# 定义函数，先收集所有包含，我们目标专业的学校，并把它们添加到 school_names中
def school_data():
    # 考研网的地址
    ky_url = 'https://yz.chsi.com.cn/zsml/queryAction.do'
    # 进行循环，不一定循环100次，当出现重复院校循环就会暂停， 因为return存在，会强制停止函数。
    for page in range(100):
        datas = {
            # 实例 url
            # /zsml/querySchAction.do?ssdm=11&dwmc=中国人民大学&mldm=zyxw&mlmc=&yjxkdm=0252&xxfs=1&zymc=应用统计
            # /zsml/querySchAction.do?ssdm=11&dwmc=中国人民大学&mldm=zyxw&mlmc=&yjxkdm=0252&xxfs=1&zymc=应用统计
            # ssdm 省份代码 后面跟省份代码
            'ssdm': '',
            # dwmc 单位名称 填学校名称
            'dwmc': ' ',
            # mldm  目录代码 如果是专硕则是zyxm是，如果是学硕则是 01之类的
            'mldm': mldm,
            # mlmc 目录名称  不清楚，不填
            'mlmc': '',
            # yjxkdm 一级学科代码  应用统计是0252
            'yjxkdm': yjxkdm,
            # zymc 专业名称 应用统计
            'zymc': '',
            # 1全日制
            'xxfs': '1',
            # 页数 我们循环不到100，
            'pageno': str(page + 1)}
        # requests发送post请求，得到html内容。
        htmls = post(ky_url, data=datas)
        # bs4 解析为树节点
        html_tree = BeautifulSoup(htmls.text, 'html.parser')
        # 找到所有td节点，遍历一下
        for i in range(len(html_tree.find_all('td'))):
            # 去掉多余信息，有规律的
            if (i % 5 == 0):
                # i  == 0 学校名称
                # 找到所有td标签，处理它们。
                school_name = html_tree.find_all('td')[i].get_text().strip().split(' ')
                school_name = school_name[0].split(')')[1]

                # 当学校名称出现重复，我们就结束函数，因为网页数超过最大值，会一直加载第一页
                if school_name in school_names:

                    return 0
                else:
                    # 把处理好的name添加到，school_names
                    school_names.append(school_name)
                    # 第一个是地区，第二个是地区名称+地区代码。有规律出现，所有可以分离。
            elif (i % 5 == 1):
                school_area = html_tree.find_all('td')[i].get_text().strip().split(' ')[0]
                school_area_code = school_area.split('(')[1].split(')')[0]
                school_area = school_area.split('(')[1].split(')')[1]
                school_areas.append(school_area)
                school_areas_code.append(school_area_code)
        # 简单的显示，符合目标的院校有多少页
        print('第', page, '页！！！！！！！！！')


# 调用获得符合目标院校姓名列表的函数。
school_data()


# 定义一个获取单个院校的函数

def get_inf(name, code, sum):
    # 考研网的url，与之前的url不同
    ky_url = 'https://yz.chsi.com.cn/zsml/querySchAction.do'
    datas = {
        # post请求格式
        # /zsml/querySchAction.do?ssdm=11&dwmc=中国人民大学&mldm=zyxw&mlmc=&yjxkdm=0252&xxfs=1&zymc=应用统计
        # /zsml/querySchAction.do?ssdm=11&dwmc=中国人民大学&mldm=zyxw&mlmc=&yjxkdm=0252&xxfs=1&zymc=应用统计
        # ssdm 后面跟省份代码
        'ssdm': code,
        # 学校名 dwmc
        'dwmc': name,
        # 如果是zyxm是专硕，如果是01之类的是学硕
        'mldm': mldm,
        # mlmc 目录名称
        'mlmc': '',
        # yjxkdm 就是一级学科代码
        'yjxkdm': yjxkdm,
        # zymc 专业名称 应用统计
        'zymc': '',
        # 1全日制
        'xxfs': '1', }
    # 获取响应页面
    htmls = post(ky_url, data=datas)
    # 用bs4 处理
    html_tree = BeautifulSoup(htmls.text, 'html.parser')
    # 进行简单的筛选，去掉有规律的无效信息
    c = 0
    for i in range(len(html_tree.select('html body div div div div table tbody tr td a'))):
        c = c + 1
        if c % 2 == 1:

            # 把从html爬取的url与主网站合并存储。
            r_url = 'https://yz.chsi.com.cn/' + html_tree.select('html body div div div div table tbody tr td a')[i][
                'href']

            # 对合并的新网页进行访问，获得考研信息。
            text_html = get(r_url).text
            text_tree = BeautifulSoup(text_html, 'html.parser')
            # 存储信息题目， 存储信息内容
            test_infs_title = []
            test_infs_text = []
            # 进行筛选，排除无效数据
            d = 0
            for i in range(len(text_tree.select('html body div div div div  table tr td'))):
                d = d + 1
                if d % 2 == 1:
                    # 题目项目
                    test_inf = \
                    text_tree.select('html body div div div div  table tr td')[i].get_text().strip().split('\n')[0]
                    test_infs_title.append(test_inf)
                else:
                    # 内容项目
                    test_inf = \
                    text_tree.select('html body div div div div  table tr td')[i].get_text().strip().split('\n')[0]
                    test_infs_text.append(test_inf)
            # 把同一个学校的信息存在一个list，再把list存到总的list中
            test_infs_text.append(test_infs_title[-1])
            test_infs_text.append(test_infs_title[-2])
            test_infs_text.append(r_url)
            # 总list
            # informations.append(test_infs_text)

            print('+'*(sum+1)+'>,已经创建数据', sum + 1)
            for i in range(0, 15):
                worksheet.write(sum + 1, i, test_infs_text[i])

            sum = sum + 1
    return sum


count = 0
sum = 0
workbook = Workbook(encoding='utf-8')
worksheet = workbook.add_sheet('考研信息')
worksheet.write(0, 0, '招生单位')
worksheet.write(0, 1, '考试方式')
worksheet.write(0, 2, '院系所')
worksheet.write(0, 3, '跨专业')
worksheet.write(0, 4, '专业')
worksheet.write(0, 5, '学习方式')
worksheet.write(0, 6, '研究方向')
worksheet.write(0, 7, '指导老师')
worksheet.write(0, 8, '拟招人数')
worksheet.write(0, 9, '招生单位')
worksheet.write(0, 10, '英语一/英语二')
worksheet.write(0, 11, '专业一')
worksheet.write(0, 12, '思政科目')
worksheet.write(0, 13, '专业二')
worksheet.write(0, 14, '信息网站')
count_max = int(input('输入一个整数型阈值，爬取学校数目不超过这个整数型阈值'))
for school_name in school_names:
    sum = get_inf(school_name, school_areas_code[count], sum)
    count = count + 1
    print('已经爬取', count, '个学校的信息', sum)
    # 去掉这一行，可以爬取所有数据
    if count == count_max:
        break
print(sum)
workbook.save('考研信息-' + str(mldm) +'---'+ str(yjxkdm) + '.xlsx')
